// 尾调用
function f(x) {
    x++
    return g(x) // 最后一步一定要返回另一个函数的执行结果 并且不能进行任何其他运算
    // return g(x) + 1   这样就不能构成尾调用
}

function g(x) {
    console.log(x)
}

f(4) // 5

// 尾递归 不需要用全局变量来保存计算结果 只要改成尾调用的形式 就能秒算...计算结果保存在参数中 可在arguments里查看
// 计算阶乘
let arr = []

function jc(n, total = 1) {

    arr.push(arguments)

    if (n === 1) return total

    return jc(n - 1, n * total)
}

console.log(jc(5)) // 120
console.log(arr) // [ [5],[ 4, 5 ], [ 3, 20 ], [ 2, 60 ], [ 1, 120 ] ]

// 斐波那契数列
function fibonacci(n, start = 1, end = 1) {

    if (n === 1) return start
    if (n === 2) return end

    return fibonacci(n - 1, end, start + end)
}

console.log(fibonacci(10)) // 55

// 小明走楼梯的问题
function stairway(n, start = 0, end = 1, total = 1) {

    // 结束条件
    if (n <= 1) {
        return start
    }

    if (n <= 3) {
        return total
    }

    return stairway(n - 1, end, total, start + end)
}